package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeAddNewDTO;
import cn.tedu.csmall.product.pojo.entity.Attribute;
import cn.tedu.csmall.product.pojo.vo.AttributeListItemVO;
import cn.tedu.csmall.product.pojo.vo.AttributeStandardVO;
import cn.tedu.csmall.product.service.IAttributeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class AttributeServiceImpl implements IAttributeService {

    @Autowired
    private AttributeMapper attributeMapper;

    @Override
    public void addNew(AttributeAddNewDTO attributeAddNewDTO) {
        log.debug("开始处理【添加属性】的业务，参数：{}", attributeAddNewDTO);
// 调用Mapper对象的int countByName(String name)方法统计此名称的属性的数量
        String name = attributeAddNewDTO.getName();
        int countByName = attributeMapper.countByName(name);
        log.debug("尝试添加的属性名称是：{}，在数据库中此名称的属性数量为：{}", name, countByName);
        // 判断统计结果是否大于0
        if (countByName > 0) {
            // 是：属性名称已经存在，抛出RuntimeException异常
            String message = "添加属性失败！属性名称【" + name + "】已存在！";
            log.warn(message);
            throw new ServiceException(ERR_CONFLICT, message);
        }
        //获得当前时间LocalDateTime now = LocalDateTime.now()
        LocalDateTime now = LocalDateTime.now();
        Attribute attribute = new Attribute();
        //补全attribute属性的值：templateId  来自attributeAddNewDTO
        //补全attribute属性的值：name  来自attributeAddNewDTO
        //补全attribute属性的值：description  来自attributeAddNewDTO
        //补全attribute属性的值：type  来自attributeAddNewDTO
        //补全attribute属性的值：inputType  来自attributeAddNewDTO
        //补全attribute属性的值：valueList  来自attributeAddNewDTO
        //补全attribute属性的值：unit  来自attributeAddNewDTO
        //补全attribute属性的值：sort  来自attributeAddNewDTO
        //补全attribute属性的值：isAllowCustomize  来自attributeAddNewDTO
        BeanUtils.copyProperties(attributeAddNewDTO, attribute);
        attribute.setGmtCreate(now);
        attribute.setGmtModified(now);
        //自动装配AttributeMapper接口
        //调用AttributeMapper接口的int insert(Attribute attribute)方法添加数据
        log.debug("即将向数据库中插入数据：{}", attribute);
        int rows = attributeMapper.insert(attribute);
        //判断插入数据时受影响的行数
        if (rows != 1) {
            String message = "添加属性失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ERR_INSERT, message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【删除属性】的业务，参数：{}", id);
        // 检查尝试删除的属性是否存在
        Object queryResult = attributeMapper.getStandardById(id);
        if (queryResult == null) {
            throw new ServiceException(ERR_CONFLICT, "删除属性失败，尝试访问的数据不存在！");
        }

        // 执行删除
        log.debug("即使删除id为{}的属性……", id);
        int rows = attributeMapper.deleteById(id);
        if (rows != 1) {
            throw new ServiceException(ERR_DELETE, "删除属性失败，服务器忙，请稍后再次尝试！");
        }
        log.debug("删除完成！");
    }

    /**
     * 根据属性的id查找数据列表
     * @return 查找到的数据
     */
    @Override
    public List<AttributeListItemVO> listData(Long id) {
        List<AttributeListItemVO> attributeDataList = attributeMapper.getAttributeDataList(id);
        return attributeDataList;
    }
}
